package com.tjetc.dynamicproxy;



import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Objects;

public class CacheInvocationHandler implements InvocationHandler {
    // 定义缓存
    private HashMap<String, String> cache = new HashMap<>(256);

    private DataQuery dataQuery;

    public CacheInvocationHandler(DatabaseDataQuery databaseDataQuery) {
        this.dataQuery = databaseDataQuery;
    }

    // 将来生成代理对象要执行的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String result = null;
        // 判断哪个方法需要增强
        if (Objects.equals("query", method.getName())) {
            // 1.查询是否击中缓存
            result = cache.get(args[0].toString());
            if (Objects.nonNull(result)) {
                System.out.println("走了缓存");
                return result;
            }

            // 2.没有命中缓存,查询数据库
            result = (String) method.invoke(dataQuery, args);
            System.out.println("走了数据库");

            // 3.如果从数据库中查询到了数据
            cache.put(args[0].toString(), result);
            return result;
        }
        // 如果不需要增强的方法 直接放行即可
        return method.invoke(dataQuery, args);
    }
}
